uniform float env_fogLength;
uniform float env_visualRange;
uniform vec3 env_cameraPos;
uniform float env_waterLevel;
uniform float env_ambientToDiffuseStrength;
uniform vec2 terrain_translation;

varying vec3 _position;
varying vec3 _normal;
varying vec2 _texture;
varying float sunStrength;

uniform sampler2D tex_map;
uniform sampler2D tex_r;
uniform sampler2D tex_g;
uniform sampler2D tex_b;
uniform sampler2D tex_detail;

void main(void) {
	vec4 result, texelmap, texdet, texelr, texelg, texelb, resultColor;

	/*
	 * mapa tekstur
	 */
	texelmap = texture2D(tex_map, _texture);

	/*
	 * rozmieszczenie 3 tekstur wg mapy
	 */
	texelr = texture2D(tex_r, _texture * 64)
			* texture2D(tex_r, _texture * 16);
	texelg = texture2D(tex_g, _texture * 64)
			* texture2D(tex_g, _texture * 16);
	texelb = texture2D(tex_b, _texture * 64)
			* texture2D(tex_b, _texture * 16);
	texdet = texture2D(tex_detail, _texture * 128);

	/*
	 * suma natężenia tekstur w danym miejscu
	 */
	float sum = texelmap.r + texelmap.g + texelmap.b;

	/*
	 * nakładanie tekstur z zadanymi natężeniami tak żeby przezroczyste nigdy
	 * nie było
	 */
	result = mix(result, texelr, 1);
	result = mix(result, texelg, (1 - texelmap.r) / sum);
	result = mix(result, texelb, texelmap.b / sum);

	/*
	 * obliczanie mgły - najpierw dystans kamera - punkt
	 */
	float dist = distance(env_cameraPos.xz, _position.xz + terrain_translation);
	//jeżeli za visualRange
	result.a =  min(max((env_visualRange - dist) / env_fogLength,
			0.0), 1.0);
	/*
	 * obliczanie ostatecznej wartości koloru na podstawie wcześniej
	 * wyliczonego natężenia światła
	 */
	vec4 sunLight = gl_LightSource[0].diffuse * sunStrength;
	sunLight.a = 1.0;

	gl_FragColor = (1.0-env_ambientToDiffuseStrength) * texdet * result * sunLight
			+ env_ambientToDiffuseStrength * texdet * result * gl_LightSource[0].ambient;
}
